原型【Prototype】

实例

// 克隆注入的company类
class Company
{
    private $company;

    public function setName($name)
    {
        $this->company = $name;
    }

    public function getName()
    {
        return $this->company;
    }
}

class Resume
{
    private $name;
    private $sex;
    private $age;
    private $timeArea;
    private $company;

    function __construct($name)
    {
        $this->name = $name;
        $this->company = new Company();
    }

    public function setPersonalInfo($sex, $age)
    {
        $this->sex = $sex;
        $this->age = $age;
        return $this;
    }

    public function setWorkExperience($timeArea, $company)
    {
        $this->timeArea = $timeArea;
        $this->company->setName($company);
        return $this;
    }

    public function display()
    {
        echo $this->name,
        ' ',
        $this->sex,
        ' ',
        $this->age, PHP_EOL;

        echo $this->timeArea,
        ' ',
        $this->company->getName(),
        PHP_EOL;
    }

    // 对引用执行深复制, 克隆后类ID不同, 防止操作同一个company类
    function __clone()
    {
        $this->company = clone $this->company;
    }
}

$resume = new Resume('佩恩');
$resume->setPersonalInfo('男', 18)
    ->setWorkExperience('2012-2018', '晓公司')
    ->display();

$resume2 = clone $resume;
$resume2->setPersonalInfo('男', 20)
    ->setWorkExperience('2018-2019', '火影公司')
    ->display();
/*
佩恩 男 18
2012-2018 晓公司
佩恩 男 20
2018-2019 火影公司
F\project\dnmp\www\localhost\test\php\t1.php77
class Resume#1 (5) {
  private $name =>
  string(6) "佩恩"
  private $sex =>
  string(3) "男"
  private $age =>
  int(18)
  private $timeArea =>
  string(9) "2012-2018"
  private $company =>
  class Company#2 (1) {
    private $company =>
    string(9) "晓公司"
  }
}
F\project\dnmp\www\localhost\test\php\t1.php78
class Resume#3 (5) {
  private $name =>
  string(6) "佩恩"
  private $sex =>
  string(3) "男"
  private $age =>
  int(20)
  private $timeArea =>
  string(9) "2018-2019"
  private $company =>
  class Company#4 (1) {
    private $company =>
    string(12) "火影公司"
  }
}
*/

总结

原型模式通过克隆一个现有实例(原型)来创建新的、可定制的对象,它隐藏了创建细节,并在对象初始化成本高昂时,能够极大地提高性能

意图

通过拷贝(克隆)一个现有原型实例来创建新对象,无需了解创建细节。

主要解决

快速在运行期生成新对象,避免重复执行耗时或复杂的构造过程,从而提高性能

何时使用

如何解决

利用已有的一个原型对象,快速地生成和原型对象一样的实例。

关键代码

应用实例

优点

缺点

使用场景

注意事项